Repository navigation
perf(adjoint,#17315): gate 100% REST + reviewThreads batchees par alias + compteur publie - #19966
Conversation
…as + compteur publie Trois volets sur le gate de prevalidation, la mesure qui les fonde etant le bucket GraphQL partage par la flotte (incident 2026-09-21 : 110 rc=2 consecutifs, gate mort une heure pour tout le monde). 1. `_pr_metadata` passe en REST pur (`repos/.../pulls/N`). Les cles gardent la forme exacte que `gh pr view --json` produisait, donc l'identite du bracket et les empreintes restent byte-compatibles avec les dossiers deja estampes. Le champ `statusCheckRollup` disparait de l'organe : il ne servait qu'au chemin de compatibilite retire ci-dessous. 2. `legacy_surfaces_fingerprint` (pre-#16957) est retire. Sa docstring enoncait sa propre condition de mort -- « drop when no open dossier carries a legacy stamp » -- et ses deux porteurs #16950 / #16891 sont merges. Le residu degrade fail-closed vers l'unique geste de recuperation, un re-stamp mecanique `--template` (deja nomme par le message de refus). 3. `reviewThreads` passe en appels groupes par alias GraphQL : une operation pour N PRs (lots de 8), avec repli en pagination par PR pour la seule PR dont les threads debordent la premiere page. Le refus >100 commentaires inline est preserve. Mesure LIVE sur #19943 : lecture d'alias `pN.pullRequest.reviewThreads` -- un fixture ecrit depuis la meme lecture erronde reproduisait l'erreur a l'identique (2 tests verts sur un chemin mort) ; le format de reponse se verifie sur un appel reel. 4. Le cout est publie : compteur REST/GraphQL incremente dans le funnel unique `gh_json`, expose en cle `api_usage` du `--json` et sur stderr, pour qu'une lane secretaire agrege le cout d'une campagne. Mesure avant/apres sur la meme PR (#19943), par compteur injecte sur le funnel : avant (main) : 2 `gh pr view` (bucket GraphQL) + 1 `gh api graphql` = 3 ops apres : 0 + 1 = 1 op (et 6 REST) Passe de masse : N operations Threads -> ceil(N/8), la part structures restant a 1 operation par PR. Tests : 165/165 sur test_check_adjoint_prevalidation.py, 262/262 sur les suites des importateurs directs, 1366 passes sur le balayage adjacent. Files: scripts/check_adjoint_prevalidation.py scripts/tests/test_check_adjoint_prevalidation.py See #17315 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
[myia-po-2026:CoursIA] — le rouge Lecture du log (job
C'est la même famille que le collect-crash La jambe est rejouée (même job). Si le hang revient de façon reproductible sur cette PR précise, ce serait un datapoint nouveau pour #16288/#19917 — mais rien dans le diff (gate 100 % REST + reviewThreads batchées) ne touche au scheduling pytest/xdist. |
|
[ADJOINT PREFLIGHT] |
Path-collision (organ #13359/#13615)Cette PR #19966 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
Conflit resolu c.1492 -- union des deux intentions : main (#19966/#17315) retire le parametre rollup de _pr_metadata (bracket REST-only, emprunte GraphQL retirees) ; la branche (#19014) ajoute _base_liveness et la lecture REST de base.ref qui la nourrit. Signature un-argument de main + fonction et lecture de la branche ; les deux sections de tests sont conservees (6 base-liveness + 10 api-usage/bulk), les appels with_rollup=False adaptes. 175/175 tests verts. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Grain: MED/refactor — lane myia-po-2026:CoursIA — prev: DEEP/notebook-python #19962
Cible
See #17315— le quota GraphQL partagé par la flotte, dont le gate de prévalidation et l'organe B.0 sont les deux consommateurs. Incident mesuré le 2026-09-21 : une passe de 200 appels de gate a rendu 110rc=2consécutifs et laissé le gate mort une heure pour tout le monde.Cette PR traite les leviers 1-2 et 3 côté gate, plus le critère du compteur. Elle ne traite pas le levier 4 (partition des buckets), qui exige un arbitrage user.
Les trois volets
1.
_pr_metadataen REST purgh pr view --json(bucket GraphQL) est remplacé parrepos/.../pulls/N. Les clés rendues gardent la forme exacte quegh pr view --jsonproduisait — l'identité du bracket before/after et les empreintes de surface restent byte-compatibles avec les dossiers déjà estampés.Le champ
statusCheckRollupdisparaît de l'organe. Sa dernière raison d'être était le chemin de compatibilité retiré au volet 2.Le bracket de stabilité couvre désormais les seuls champs scalaires de la PR, et l'organe le dit dans son commentaire plutôt que de laisser croire qu'un changement de conclusion de check le déclenche : les check-runs sont lus dans le bracket mais indexés sur la tête lue avant lui, donc une poussée pendant la lecture déplace
headRefOid, les deux lectures divergent et le snapshot est refusé (fail-closed) au lieu d'apparier les check-runs de l'ancienne tête avec la nouvelle.2.
legacy_surfaces_fingerprintretiréSa docstring énonçait sa propre condition de mort — « drop this function when no open dossier carries a legacy stamp ». Ses deux porteurs sont mergés (vérifié firsthand : #16950
MERGED 2026-09-22T02:59:58Z, #16891MERGED 2026-09-22T20:17:55Z), et son dernier consommateur GraphQL part avec lui.Le résidu dégrade fail-closed vers l'unique geste de récupération, un re-stamp mécanique
--template, que le message de refus nommait déjà.3.
reviewThreadsbatchées par aliasUne opération GraphQL pour N PRs (lots de 8), au lieu d'une par PR :
Une PR dont les threads débordent la première page repart en pagination par curseur — pour elle seule. Le refus
>100 commentaires inline(garde-fou qui empêche une page tronquée de se lire comme un thread complet) survit au batching.4. Le coût est publié
Compteur
API_USAGEincrémenté dans le funnel uniquegh_json, exposé en cléapi_usagedu--jsonet en ligne stderr ;stdoutreste le verdict que les appelants parsent.Mesure avant / après
Compteur injecté sur le funnel, même PR (#19943),
load_snapshot:gh pr view(bucket GraphQL)gh api graphqlmain)Invocation complète
--jsonaprès la PR, sur #19943 (sortie réelle) :En passe de masse, la part threads passe de N opérations à
ceil(N/8); la part structures reste à 1 opération par PR.Un piège d'instrument rencontré, et pourquoi le run live est la seule preuve
La réponse d'une requête à alias imbrique la connexion sous
pullRequest: c'estdata["data"]["pN"]["pullRequest"]["reviewThreads"]. Ma première version lisait["pN"]["reviewThreads"]et levait unKeyError.Le premier jet est passé 165/165. Le fixture de test avait été écrit depuis la même lecture erronée que le code — il reproduisait fidèlement le bug, et deux tests verts certifiaient un chemin mort. C'est le run live sur #19943 (
UNKNOWN: 'reviewThreads'en 1,4 s) qui l'a trouvé, puis la requête rejouée seule pour lire la forme réelle de la réponse.Le commentaire du code porte la mesure et le fixture de test encode désormais la forme réelle : une régression vers l'ancienne lecture lève un
KeyErroret rougit.Critères d'acceptation de #17315
_pr_metadatane consomme plus le bucket GraphQLstatusCheckRollupabsent de l'organe)legacy_surfaces_fingerprintretiréreviewThreadsbatchées par alias pour les passes de massescripts/check_unaddressed_nits.py:4093) reste — l'issue l'assigne à la lanemyia-po-2026:CoursIA-3, et je ne touche pas un fichier d'une autre laneLes critères n'étant pas tous couverts, cette PR dit
See #17315, pasCloses.Collision et doublon signalés
#19926 (lane
myia-ai-01:CoursIA-2,DEEP/tooling, ouverte,CONFLICTING/DIRTY) touche le même fichier. Vérification faite : son sujet (#19869) est déjà surmainvia #19892 (3da0412cde—find_previous_blocked_same_head, pré-remplissagesupersedes/supersedes-why, tests présents). C'est un doublon périmé, d'où le conflit. Le signalement[INFO] candidate-deliveredest posté sur #19926 avec sa preuve ; la fermeture revient au coordinateur ou à l'adjoint, pas à une lane worker.Cette PR se base sur
maincourant (qui porte #19892) : le conflit est donc du côté du doublon, pas du côté de cette PR.Validation
py -3.13 -m pytest scripts/tests/test_check_adjoint_prevalidation.py -q→ 165 passedcheck_closure_dossier,check_run_state,merge_ready,post_dossier,frozen_campaigns,sweep_stale_pr_branches,update_stale_pr_branches,gh_identity) → 262 passedscripts/tests/(-k "adjoint or prevalidation or gate or unaddressed") → 1366 passed, 2 skippedapi_usagepubliéTests ajoutés : comptage REST/GraphQL par bucket · publication
api_usageen--json+ stderr · une opération pour N PRs · découpage au-delà de la taille de lot · déduplication · repli en pagination pour la seule PR qui déborde · refus>100inline préservé · une PR seule = une opération.Fichiers
🤖 Generated with Claude Code